import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Base64;

/**
 * 测试：使用ep加密前的原始值作为AES密钥
 */
public class OriginalEPKeyTest {
    
    // 从QUICKSTART.md中的示例数据
    private static final String EP_BASE64 = "ANGLSNR8Zk3Gl65iDcRjrFVs5lfOV/RbxORhd611tbmXfjCqdH/HHHDrwwJJPuuG4C/gVn3l6QWVTQgdTynaOoODxVnlpg2BubvrpwoofIq/xW3g1veNSBRJjINbRLova6dBVDJw10A5fIfEqtH6bclaQsvmHmNnCE8hj9NQZOFNjMZVJJn7aoeN/Q41uYZ30O0B5G7vLAVMOinnF0aoxz34cHriLRMkl1GQhCOP3vi4qeSeilzmghS5EFRy1eCfmrx2r4OZbu6kpYoNkN6r8GmSpyFV6bBq7aV19RNBHGWM+/uEGsmiySlVVXgZcHumRG4mVqdkTW0Tbga+fAglx3s=";
    private static final String DATA_BASE64 = "wHBy2LDIay6WCgEyxO8bw9tWZbLI/zDcnkAr8Gq/LMXahZiBV+nkYIDZQFiT4OAQmj5u7KTXpCMjgfGJ9cFXXxo8w7kPpTI9ixxKYj53cF8=";
    private static final String TN_BASE64 = "6rOG";
    
    public static void main(String[] args) {
        System.out.println("================================================================================");
        System.out.println("测试：ep加密前的原始值作为密钥");
        System.out.println("================================================================================\n");
        
        try {
            byte[] epEncrypted = Base64.getDecoder().decode(EP_BASE64);
            byte[] data = Base64.getDecoder().decode(DATA_BASE64);
            
            System.out.println("? ep加密数据: " + epEncrypted.length + " 字节");
            System.out.println("ep hex: " + bytesToHex(epEncrypted));
            System.out.println("\n? data加密数据: " + data.length + " 字节");
            System.out.println("data hex: " + bytesToHex(data));
            
            // ep是被RSA加密的，原始值应该小于256字节
            // 根据RSA-2048，解密后最多256字节，但实际原始数据会小一些
            
            // 思路：既然我们不知道ep的原始值，那就先尝试从已知信息推断
            // 1. 如果ep原始值是32字节（AES-256密钥长度），它应该是随机生成的
            // 2. 但我们现在无法直接得到ep原始值（需要RSA私钥）
            
            System.out.println("\n" + "=".repeat(80));
            System.out.println("分析");
            System.out.println("=".repeat(80));
            System.out.println("? ep是被RSA公钥加密的，我们需要RSA私钥才能解密得到原始值");
            System.out.println("? 如果ep原始值确实是AES密钥：");
            System.out.println("  - AES-256需要32字节密钥");
            System.out.println("  - ep原始值很可能就是32字节的随机数据");
            System.out.println("\n? 问题：如何获取ep的原始值？");
            System.out.println("  方案1：从libsmsdk.so中提取RSA私钥");
            System.out.println("  方案2：使用Frida Hook在运行时捕获ep原始值");
            System.out.println("  方案3：分析libsmsdk.so找到密钥生成逻辑");
            
            System.out.println("\n" + "=".repeat(80));
            System.out.println("验证思路");
            System.out.println("=".repeat(80));
            System.out.println("让我搜索libsmsdk.so中的RSA相关代码...");
            
        } catch (Exception e) {
            System.err.println("✗ 错误: " + e.getMessage());
            e.printStackTrace();
        }
    }
    
    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }
    
    private static byte[] hexToBytes(String hex) {
        int len = hex.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
                    + Character.digit(hex.charAt(i+1), 16));
        }
        return data;
    }
}



